"""
zip()：将多个列表（或其他可迭代对象）的元素按位置匹配，生成一个个“元组组合”
    原因解析：迭代器的「一次性」特性
    惰性计算：
    zip() 不会一次性生成所有配对结果，而是像「流水线」一样，每次循环时动态生成一个元组。
    优点：处理超长列表时不会占用大量内存（比如两个各有100万元素的列表，zip后不会生成100万元组存内存里）。
    缺点：遍历结束后，迭代器就像「倒空的瓶子」，再倒不会有东西出来。

    解决方法：需要重复访问时
    如果想多次使用 zip() 的结果，可以将其转换为列表（牺牲少量内存换重复使用）

    1. 为什么直接打印 zip 对象看起来奇怪？
    当你直接打印 zip 对象时，看到的是类似 <zip object at 0x...> 的信息，这是因为：
    迭代器是惰性计算的：zip 不会一次性生成所有配对结果，而是“按需生成”（每次循环时动态生成一个元素）。
    节省内存：如果两个列表各有 100 万个元素，zip 不会预先生成 100 万个元组占满内存，而是每次循环时生成一个，处理完就丢弃。

    2. 如何查看 zip 的内容？
    要查看 zip 的结果，需要触发迭代器的计算。常见方法：
    方法 1：转换为列表（强制迭代所有元素）
    原理：list() 会遍历迭代器中的所有元素，将它们存储到列表中。
    方法 2：用循环遍历（逐次触发）
"""

keys = ["a", "b", "c"]
values = [1, 2, 3]
zipped = zip(keys, values)
print(list(zipped))  # 第一次访问正常
print(list(zipped))  # 第二次访问空了

# 如果想多次使用 zip() 的结果，可以将其转换为列表（牺牲少量内存换重复使用）
names = ["小明", "小红"]
ages = [18, 20]
zip_result = list(zip(names, ages))
print(zip_result)
print(zip_result)
for k, v in zip_result:
    print(k, v)
